package com.tanger.common.result;

import org.springframework.http.HttpStatus;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 
 * @Description: 响应结果
 * @author Hchenbin.
 * @date 2023年8月24日 下午5:27:44
 * @ClassName: ActionResult
 * 
 * @param <T>
 */
public class Results<T> implements Serializable {

	private static final long serialVersionUID = -8041820346732720877L;
	private static final String resultMsg = "success";
	private int status;// 状态编码
	private String message;// 消息
	private T data;

	public Results() {
		super();
	}

	public Results(int status, T data, String message) {
		super();
		this.status = status;
		this.message = message;
		this.data = data;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}

	/**
	 *
	 * @Description: 成功:返回字符串结果
	 * @return
	 * @author Hchenbin.
	 * @date 2023年8月24日 下午5:29:59
	 * @version V1.0
	 */
	public static <T> Results<T> buildSuccess() {
		Results<T> listResult = new Results<>();
		try {
			listResult.setData(null);
			listResult.setStatus(HttpStatus.OK.value());
			listResult.setMessage(resultMsg);
		} catch (Exception e) {
			return Results.fail(e.getMessage());
		}
		return listResult;
	}

	/**
	 *
	 * @Description: 成功:返回字符串结果
	 * @return
	 * @author Hchenbin.
	 * @date 2023年8月24日 下午5:29:59
	 * @version V1.0
	 */
	public static <T> Results<T> buildSuccess(Object obj) {
		Results listResult = new Results<>();
		try {
			listResult.setData(obj);
			listResult.setStatus(HttpStatus.OK.value());
			listResult.setMessage(resultMsg);
		} catch (Exception e) {
			return Results.fail(e.getMessage());
		}
		return listResult;
	}


	/**
	 *
	 * @Description: 成功:返回字符串结果
	 * @param data
	 * @return
	 * @author Hchenbin.
	 * @date 2023年8月24日 下午5:29:59
	 * @version V1.0
	 */
	public static <T> Results<T> buildSuccess(String data) {
		Results listResult = new Results<>();
		try {
			listResult.setData(data);
			listResult.setStatus(HttpStatus.OK.value());
			listResult.setMessage(resultMsg);
		} catch (Exception e) {
			return Results.fail(e.getMessage());
		}
		return listResult;
	}
	
	/**
	 * 
	 * @Description: 成功:返回Map结果
	 * @param data
	 * @return
	 * @author Hchenbin.
	 * @date 2023年8月24日 下午5:32:33
	 * @version V1.0
	 */
	public static <T> Results<T> buildSuccess(Map<String, Object> data) {
		Results listResult = new Results<>();
		try {
			listResult.setData(data);
			listResult.setStatus(HttpStatus.OK.value());
			listResult.setMessage(resultMsg);
		} catch (Exception e) {
			return Results.fail(e.getMessage());
		}
		return listResult;
	}

	/**
	 *
	 * @Description: 成功:返回List结果
	 * @param data
	 * @return
	 * @author Hchenbin.
	 * @date 2023年8月24日 下午5:35:04
	 * @version V1.0
	 */
	public static <T> Results<T> buildSuccess(List<?> data) {
		Results listResult = new Results<>();
		try {
			listResult.setData(data);
			listResult.setStatus(HttpStatus.OK.value());
			listResult.setMessage(resultMsg);
		} catch (Exception e) {
			return Results.fail(e.getMessage());
		}
		return listResult;
	}

	/**
	 * 
	 * @Description: 错误:返回错误信息及字符串数据
	 * @param message
	 * @param data
	 * @return
	 * @author Hchenbin.
	 * @date 2023年8月24日 下午5:40:24
	 * @version V1.0
	 */
	public static <T> Results<T> fail(String message, String data) {
		Results listResult = new Results<>();
		listResult.setData(data);
		listResult.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
		listResult.setMessage(message);
		return listResult;
	}

	/**
	 *
	 * @Description: 错误:返回错误信息及字符串数据
	 * @param message
	 * @param data
	 * @return
	 * @author Hchenbin.
	 * @date 2023年8月24日 下午5:40:24
	 * @version V1.0
	 */
	public static <T> Results<T> fail(int code, String message, String data) {
		Results listResult = new Results<>();
		listResult.setData(data);
		listResult.setStatus(code);
		listResult.setMessage(message);
		return listResult;
	}
	
	/**
	 * 
	 * @Description: 错误:返回错误信息
	 * @param message
	 * @return
	 * @author Hchenbin.
	 * @date 2023年8月24日 下午5:42:19
	 * @version V1.0
	 */
	public static Results fail(String message) {
		Results listResult = new Results<>();
		listResult.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
		listResult.setMessage(message);
		return listResult;
	}

	/**
	 * 未登录返回结果
	 */
	public static Results<Object> unauthorized(Object data) {
		Results<Object> listResult = new Results<>();
		listResult.setStatus(HttpStatus.UNAUTHORIZED.value());
		listResult.setMessage(HttpStatus.UNAUTHORIZED.name());
		listResult.setData(data);
		return listResult;
	}

	/**
	 * 未授权返回结果
	 */
	public static Results<Object> forbidden(Object data) {
		Results<Object> listResult = new Results<>();
		listResult.setStatus(HttpStatus.FORBIDDEN.value());
		listResult.setMessage(HttpStatus.FORBIDDEN.name());
		listResult.setData(data);
		return listResult;
	}
}
